package com.shaiMiMi;

public class ZHexConver {
	/**
    * 字符串转换成十六进制字符串
    * @param String str 待转换的ASCII字符串
    * @return String 如: [616C6B]
    */
   public static String str2HexStr(String str)
   {
       char[] chars = "0123456789ABCDEF".toCharArray();
       StringBuilder sb = new StringBuilder("");
       byte[] bs = str.getBytes();
       int bit;

       for (int i = 0; i < bs.length; i++)
       {
           bit = (bs[i] & 0x0f0) >> 4;
           sb.append(chars[bit]);
           bit = bs[i] & 0x0f;
           sb.append(chars[bit]);
       }
       return sb.toString().trim();
   }

   /**
    * 十六进制转换字符串
    * @param String str Byte字符串(Byte之间无分隔符 如:[616C6B])
    * @return String 对应的字符串
    */
   public static String hexStr2Str(String hexStr)
   {
       String str = "0123456789ABCDEF";
       char[] hexs = hexStr.toCharArray();
       byte[] bytes = new byte[hexStr.length() / 2];
       int n;

       for (int i = 0; i < bytes.length; i++)
       {
           n = str.indexOf(hexs[2 * i]) * 16;
           n += str.indexOf(hexs[2 * i + 1]);
           bytes[i] = (byte) (n & 0xff);
       }
       return new String(bytes);
   }

   /**
    * bytes转换成十六进制字符串
    * @param byte[] b byte数组
    * @return String
    */
   public static String byte2HexStr(byte[] b)
   {
       String stmp="";
       StringBuilder sb = new StringBuilder("");
       for (int n=0;n<b.length;n++)
       {
           stmp = Integer.toHexString(b[n] & 0xFF);
           sb.append((stmp.length()==1)? "0"+stmp : stmp);
       }
       return sb.toString().toUpperCase().trim();
   }

   /**
    * bytes字符串转换为Byte值
    * @param String src Byte字符串，每个Byte之间没有分隔符
    * @return byte[]
    */
   public static byte[] hexStr2Bytes(String src)
   {
	   int m=0,n=0;
       int l=src.length()/2;
       byte[] ret = new byte[l];
       for (int i = 0; i < l; i++)
       {
           m=i*2+1;
           n=m+1;
           ret[i] = Byte.decode("0x" + src.substring(i*2, m) + src.substring(m,n));
      }
      return ret;
   }

   /**
    * String的字符串转换成unicode的String
    * @param String strText 全角字符串
    * @return String 每个unicode之间无分隔符
    * @throws Exception
    */
    public static String strToUnicode(String strText)
        throws Exception
    {
        char c;
        StringBuilder str = new StringBuilder();
        int intAsc;
        String strHex;
        for (int i = 0; i < strText.length(); i++)
        {
            c = strText.charAt(i);
            intAsc = (int) c;
            strHex = Integer.toHexString(intAsc);
            if (intAsc > 128)
                str.append("\\u" + strHex);
            else // 低位在前面补00
                str.append("\\u00" + strHex);
        }
        return str.toString();
    }

    /**
     * unicode的String转换成String的字符串
     * @param String hex 16进制值字符串 （一个unicode为2byte）
     * @return String 全角字符串
     */
    public static String unicodeToString(String hex)
    {
        int t = hex.length() / 6;
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < t; i++)
        {
            String s = hex.substring(i * 6, (i + 1) * 6);
            // 高位需要补上00再转
            String s1 = s.substring(2, 4) + "00";
            // 低位直接转
            String s2 = s.substring(4);
            // 将16进制的string转为int
            int n = Integer.valueOf(s1, 16) + Integer.valueOf(s2, 16);
            // 将int转换为字符
            char[] chars = Character.toChars(n);
            str.append(new String(chars));
        }
        return str.toString();
    }
}
